import { Inject } from '@nestjs/common';
import { LoggerService } from './logger.service';

/**
 * 日志装饰器
 * 用于在控制器或服务中注入日志服务并自动设置上下文
 * @returns 属性装饰器
 */
export function Logger() {
  return (target: any, propertyKey: string) => {
    // 获取类名作为日志上下文
    const context = target.constructor.name;

    // 使用Inject装饰器注入LoggerService
    Inject(LoggerService)(target, propertyKey);

    // 保存原始的setter
    const originalSetter = Object.getOwnPropertyDescriptor(
      target,
      propertyKey,
    )?.set;

    // 定义新的属性描述符
    Object.defineProperty(target, propertyKey, {
      set(loggerService: LoggerService) {
        // 设置日志上下文
        loggerService.setContext(context);

        // 调用原始setter（如果存在）
        if (originalSetter) {
          originalSetter.call(this, loggerService);
        }
      },
      configurable: true,
    });
  };
}
